package com.ylr.netty.helloword.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;

/**
 * @Classname HelloServer
 * @Description TODO
 * @Date 2021/9/18 10:38
 * @Created by ylr
 */
public class HelloServer {

    public static void main(String[] args) {
        //启动服务器
        new ServerBootstrap()
                //创建nioeventloopgroup 事件循环器 线程池+selector   设置反应器轮询组
                .group(new NioEventLoopGroup())
                //选择服务器的serversocketchannel实现     设置 nio 类型的通道
                .channel(NioServerSocketChannel.class)
                //child 负责读写 该方法决定了child执行那些操作
                //channelInitializer处理器,只执行一次
                // 他的作用是待客户端SocketChannel建立连接后执行initChannel以便添加更多的处理器
                //装配子通道流水线
                .childHandler(new ChannelInitializer<NioSocketChannel>() {
                    ///有连接到达时会创建一个通道
                    @Override
                    protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                        // 流水线的职责：负责管理通道中的 Handler 处理器
                        // 向“子通道”（传输通道）流水线添加一个 handler 处理器
                        // 5、SocketChannel的处理器，使用StringDecoder解码，ByteBuf=>String
                        nioSocketChannel.pipeline().addLast(new StringDecoder());
                        // 6、SocketChannel的业务处理，使用上一个处理器的处理结果
                        nioSocketChannel.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                            @Override
                            protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
                                System.out.println(s);
                            }
                        });
                    }
                    // 7、ServerSocketChannel绑定8080端口
                }).bind(8888);


    }
}
